07 - Optyka i działanie kamer

Wprowadzenie do przetwarzania obrazów

Politechnika Poznańska, Instytut Robotyki i Inteligencji Maszynowej

Ćwiczenie laboratoryjne 7: optyka kamery oraz jej kalibracja

Powrót do spisu treści ćwiczeń laboratoryjnych

Wstęp

Podczas tego laboratorium poznasz fizyczne i optyczne cechy kamery USB. Dowiesz się, jak zmiana obiektywu wpływa na kąty widzenia kamery i jej ogniskową oraz jak manipulacja przesłoną wpływa na głębie ostrości i szybkość akwizycji obrazu. W kolejnym podrozdziale przeprowadzisz kalibrację kamery.

Dane

Pobierz paczkę ze skryptami do zadań.

Obiektywy


Źródło: Obiektywy w systemach telewizji dozorowej.

Zbadaj jak zmienia się obraz kamery przy zmianie ogniskowej jej obiektywu. Odpowiedz na pytania: * Jaką charakterystykę obrazu tracimy zwiększając ogniskową soczewki a jaką zyskujemy? * W jakich sytuacjach korzystne jest posiadanie bardzo szerokiego kąta widzenia?

Przysłona

Przysłona ma za zadanie ograniczać ilość światła wpadającego do obiektywu, a tym samym zapobiegać „prześwietlaniu” powstającego w kamerze obrazu. Regulując przesłonę, kontrolujemy ilość światła przechodzącego przez soczewki obiektywu. Jednocześnie wpływamy na głębie ostrości otrzymanego obrazu, ponieważ wyższa wartość przesłony powoduje wyższą głębię ostrości.

Zadanie
Uruchom skrypt scripts/07/shutter.py. Korzystając z pokrętła zmiany przesłony na kamerze (pierścień bez śruby), ustaw odpowiednią ilość wpadającego światła. Sprawdź, jak wpływa na obraz dodatkowe oświetlenie (możesz wykorzystać latarkę w telefonie), a jak jego niedobór.

Następnie zminiejszaj delikatnie rozwarcie soczewki i jednocześnie obserwuj liczbę klatek na sekundę. Zastanów się, skąd może wynikać taka zmiana?

Kalibracja kamery

Rejestratory obrazu mogą posiadać wady i niedoskonałości fabryczne, które sprawiają, że obraz jest zniekształcony. Najczęściej widocznym zniekształceniem jest efekt rybiego oka, który sprawia, że linie proste nie leżą w jednej linii. Efekt ten można zredukować, znajdując parametry wewnętrzne kamery, co nazywamy kalibracją.

Aby skutecznie przeprowadzić kalibrację kamery, potrzebny jest obiekt o znanych kształtach i rozmiarach. Najczęściej jest to jednak tablica z naniesioną szachownicą. W naszym przypadku jest to szachownica 8x5, gdyż liczymy wewnętrzne narożniki.

Znany wzorzec jest wielokrotnie rejestrowany, z możliwie różnych kątów oraz pozycji kamery, zwłaszcza na skrajnych częściach obrazu. Pozwoli to zróżnicować dane i dobrać najlepsze dopasowanie.

Jak liczyć wielkość macierzy kalibracyjnej?

Zadanie
Wykorzystaj skrypt scripts/07/calibration/1_collect_images.py do zebrania zbioru kalibracyjnego. Program został tak napisany, żeby po wciśnięciu klawisza spacja, zapisać obecną klatkę do katalogu frames. Zbierz między 40 a 80 zdjęć, postaraj się, by były one zróżnicowane i ostre. Klawisz q pozwoli zakończyń program.

Uruchom skypt scripts/07/calibration/2_find_chessboard.py. Wyszuka on na każdym obrazie punkty charakterystyczne szachownicy oraz zwizualizuje. Następnie rozpocząnie się kalibracja (może potrwać to kilka minut przy większej liczbie zdjęć). Po prawidłowej kalibracji algorytm wypisze w terminalu parametry wewnętrzne kamery. Zachowaj je.

Uwaga: Optyka kamery powinna pozostać niezmieniona w trakcie zbierania zdjęć oraz po przeprowadzeniu procesu kalibracji. Każdorazowa zmiana parametrów wymaga zebrania nowego zestawu zdjęć oraz wykonania ponownej kalibracji.

Uzupełnij w skrypcie scripts/07/calibration/3_show_calibrated_camera.py słownik cfg korzystając z obliczonych parametrów wewnętrznych kamery. Uruchom skypt i korzystając z klawisza spacja zmień tryby wyświetlania. Czy obraz został w widoczny sposób poprawiony? Sprawdź czy zmiana głębi oraz zoomu w kamerze wymaga jej ponownej kalibracji.

Efekt przedstawiono na filmie.

Obraz pseudo-3D

Kalibracja kamery pozwala na wykorzystanie narzędzi wprowadzających pseudo obraz 3D, który jest podstawą rozszerzonej rzeczywistości (ang. augmented reality, AR). Prostym narzędziem wykorzystywanym w robotyce są kody aruco, do których są wbudowane w opencv metody ich detekcji, lokalizacji oraz deskrypcji. Przykładowe zastosowania przedstawiono tutaj, tutaj, tutaj i tutaj.

Zadanie
Upewnij się, że w swoim środowisku masz zainstalowaną bibliotekę opencv-contrib-python.

Wykorzystaj skrypt aruco_ar.py by wyświetlić modele sześcianów nałożonych na kody aruco. Twoim zadaniem jest wykorzystać informację o id wykrytego znacznika aruco_id oraz pokolorować boxa na różne kolory aruco_color.

Opcjonalnie
Pobierz na telefon plik pdf (lub kilka) z kodem Aruco i sprawdź ich działanie. Zastanów się, jakie widzisz zastosowanie w robotyce a jakie w automatyce? Przykładowy rezultat przedstawiono na filmie.

Sklejanie obrazów (panorama)

W opencv został zaimplementowany algorytm, który pozwala na dopasowanie wielu obrazów do siebie. Jest to klasa cv2.Stitcher_create, która wykonuje dla zdjęć następujące kroki: - wykrywa punkty charakterystyczne na obrazie i używa deskryptorów do ich opsu, - dopasowuje te punkty między obrazami na podstawie podobieństwa, - wykorzystuje dopasowane punkty oraz algorytm RANSAC do wyliczania macierzy przekształceń dla obrazów, by móc je dopasować do siebie - wykonuje sklejenie obrazów na podstawie macierzy przekształceń.

Więcej informacji o tym mechaniźmie można znaleźć w tym artykule.

Zadanie
Korzystając ze skrytpu image_stitching.py, zbierz pokrywajce się częściowo zdjęcia (przy użyciu klawisza spacji), a następnie wciśnij klawisz c, który rozpoczyna proces generowania panoramy. Zwróć uwagę na dokładoność łączenia na krawędziach. Uwaga: Zadanie dopasowywania cech jest bardzo zasobożerne, więc może długo trwać jeśli zostało wykonane wiele zdjęć.